/*
*
* ES6诞生以前，异步编程的方法，大概有如下四种：回调函数、事件监听、发布/订阅、Promise对象；
*   ES6中，引入了Generator函数；ES2017中，async更是将异步编程带入了一个全新的阶段。
* */

/*
* @object Promise
* @disadvantage : 无法取消Promise，一旦新建它就会执行，无法中途取消
*                 如果不设置回调函数，Promise内部抛出的错误，不会反应到外部
*                 当处于Pending状态时，无法得知目前进展到哪一个阶段（刚刚开始还是即将完成）。
* */
//例子:1
// let promise = new Promise(function (resolve, reject) {
//     resolve('success');
//     reject('failure')
// });
// promise.then(function (val) {
//     console.log(val)
//
// }, function (error) {
//     console.log(error)
// });
//
// //例子:2
// function timeout(ms) {
//     return new Promise((resolve, reject) => {
//         setTimeout(resolve, ms, 'success');
//
//         setTimeout(reject,2000,'failure')
//     });
// }
//
// timeout(100).then((value) => {
//     console.log(value);
// },function (err) {
//     console.log(err)
// });
//
// //例子:3封装给XHR请求使用
// function requestGetXHR(url) {
//     return promise = new Promise(function (resolve, reject) {
//         const handler = function () {
//             if (this.readyState !== 4) {
//                 return;
//             }
//             if (this.status === 200) {
//                 resolve(this.response);
//             } else {
//                 reject(new Error(this.statusText));
//             }
//         };
//         const client = new XMLHttpRequest();
//         client.open("GET", url);
//         client.onreadystatechange = handler;
//         client.responseType = "json";
//         client.setRequestHeader("Accept", "application/json");
//         client.send();
//     })
//
// }

// let url = 'http://www.baidu.com';
// requestGetXHR(url).then(function (res) {
//     console.log(res)
// }).catch( function (err) {
//     console.log(err)
//
// });


//例子:5
// const promises = [2,6,852,85,1].map(function (id) {
//     return requestGetXHR('/post/'+id);
// });
// Promise.all(promises).then(function (posts) {
//     console.log(posts)
// }).catch(function(reason){
//     console.log(reason)
// });

function demo(test){
    console.log('test211')
    return Promise.resolve(test)
}
function timeout(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, ms, 'success');

        setTimeout(reject,2000,'failure')
    });
}

 async function asyncFun(){
    console.log('test22');
     let val = await demo('testttt');
     console.log(val)
     demo('iid').then((val)=>{
        console.log('1111')
        console.log(val)
    })
}

asyncFun()